import store from '@/store/'
import router from '@/router/router'
import website from '@/config/website'
import { getToken, setTokenConfig, getTokenConfigObj } from '@/util/auth'
import { resetRouter } from '@/router/router'
import { tokenConfig } from '@/api/user'
import { removeTokenConfig } from '@/util/auth'

/**
 * 登录流程
 * 1.路由守卫拦截是否已经有tokenConfig信息,
 * 如果没有则跳转到tokenConfig页面,并且把isAuth，path（isAuth不为false时）参数带过去
 * 2.tokenConfig页面获取到信息后，根据isAuth判断是否需要登录，如果需要登录则登录，否则跳转path页面
 * 3.接口请求返回401，则根据接口返回的信息进行跳转到普通登录页面/逃生通道，统一认证登录页面
 *
 */

/**
 *
 * @param {*} isRedirectLogin 是否强制重定向到登录页面
 * @param {*} tokenData 统一身份认证配置信息
 * @returns
 */

const redirect = (isRedirectLogin, tokenData) => {
  if (process.env.VUE_APP_TYPE !== 'boot' && !tokenData) {
    tokenData = getTokenConfigObj().tokenData
    if (!tokenData) {
      console.error('统一身份认证配置信息为空')
      return
    }
  }
  // 登录方式: 普通的用户名密码登录；逃生通道登录方式；统一身份认证；
  resetRouter()
  if (process.env.VUE_APP_TYPE === 'boot' || (tokenData && tokenData.sosWay)) {
    const isLogin = getToken()
    if (!isLogin) {
      router.replace('/login')
      return
    }
    store.dispatch('LogOut').then(() => {
      router.replace('/login')
    })
  } else {
    // 本地开发环境
    if (process.env.VUE_APP_ENV === 'dev') {
      tokenData.redirecrtUri = `${window.location.origin}/#/back?path=`
    }
    const backPath = sessionStorage.getItem(website.key + '-token-config' + '-beforeTokenConfigUrl') || '/'
    // 应用系统地址
    const appUrl = encodeURIComponent(tokenData.redirecrtUri + backPath)

    // 统一身份认证
    store.dispatch('FedLogOut').then(() => {
      let redirectUrl = isRedirectLogin ? tokenData.authorizeLogInUrl : tokenData.authorizeLogoutUrl
      redirectUrl += '&redirect_uri=' + appUrl

      window.location.replace(redirectUrl)
    })
  }
}

/**
 * 重定向到登录页面
 * @param {*} tokenData 统一认证配置信息(401或未登录情况)
 */
export const redirectLogin = (tokenData) => {

  redirect(true, tokenData)
}

/**
 * 重定向到退出登录url
 */
export const redirectLogout = () => {
  tokenConfig().then(config => {
    // 退出登录刷新tokenConfig信息
    setTokenConfig(config.data.data)
  }).finally(() => {
    redirect(false)
  })
}

/**
 * 重新获取tokenConfig信息
 */
export const resetTokenConfig = () => {
  store.dispatch('FedLogOut').then(() => {
    removeTokenConfig()
    router.replace('/tokenConfig')
  })
}
